package com.mall.framework.service;

import com.mall.common.model.UserAuth;
import java.util.List;
import java.util.Map;

/**
 * 缓存服务接口
 */
public interface CacheService {
    
    /**
     * 存储用户Token
     * @param userId 用户ID
     * @param token JWT Token
     * @param expireTime 过期时间（秒）
     */
    void storeUserToken(Long userId, String token, long expireTime);
    
    /**
     * 获取用户Token
     * @param userId 用户ID
     * @return Token
     */
    String getUserToken(Long userId);
    
    /**
     * 删除用户Token
     * @param userId 用户ID
     */
    void removeUserToken(Long userId);
    
    /**
     * 将Token加入黑名单
     * @param token JWT Token
     * @param expireTime 过期时间（秒）
     */
    void addTokenToBlacklist(String token, long expireTime);
    
    /**
     * 检查Token是否在黑名单中
     * @param token JWT Token
     * @return 是否在黑名单中
     */
    boolean isTokenInBlacklist(String token);
    
    /**
     * 存储用户信息
     * @param userId 用户ID
     * @param userAuth 用户认证信息
     * @param expireTime 过期时间（秒）
     */
    void storeUserInfo(Long userId, UserAuth userAuth, long expireTime);
    
    /**
     * 获取用户信息
     * @param userId 用户ID
     * @return 用户认证信息
     */
    UserAuth getUserInfo(Long userId);
    
    /**
     * 删除用户信息
     * @param userId 用户ID
     */
    void removeUserInfo(Long userId);
    
    /**
     * 刷新Token过期时间
     * @param userId 用户ID
     * @param expireTime 新的过期时间（秒）
     */
    void refreshTokenExpireTime(Long userId, long expireTime);
    
    /**
     * 获取Token剩余过期时间
     * @param userId 用户ID
     * @return 剩余过期时间（秒）
     */
    long getTokenExpireTime(Long userId);
    
    // ================== 多设备管理 ==================
    
    /**
     * 存储用户会话信息
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param sessionInfo 会话信息
     * @param expireTime 过期时间（秒）
     */
    void storeUserSession(Long userId, String deviceId, Map<String, Object> sessionInfo, long expireTime);
    
    /**
     * 获取用户所有活跃会话
     * @param userId 用户ID
     * @return 会话列表
     */
    List<Map<String, Object>> getUserSessions(Long userId);
    
    /**
     * 删除指定设备的会话
     * @param userId 用户ID
     * @param deviceId 设备ID
     */
    void removeUserSession(Long userId, String deviceId);
    
    /**
     * 删除用户所有会话
     * @param userId 用户ID
     */
    void removeAllUserSessions(Long userId);
    
    /**
     * 获取用户在线设备数量
     * @param userId 用户ID
     * @return 设备数量
     */
    long getUserOnlineDeviceCount(Long userId);
    
    // ================== 设备Token映射 ==================
    
    /**
     * 存储设备Token映射
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param token JWT Token
     * @param expireTime 过期时间（秒）
     */
    void storeDeviceToken(Long userId, String deviceId, String token, long expireTime);
    
    /**
     * 获取设备Token
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return Token
     */
    String getDeviceToken(Long userId, String deviceId);
    
    /**
     * 删除设备Token
     * @param userId 用户ID
     * @param deviceId 设备ID
     */
    void removeDeviceToken(Long userId, String deviceId);
    
    // ================== 登出统计 ==================
    
    /**
     * 记录登出事件
     * @param userId 用户ID
     * @param logoutInfo 登出信息
     */
    void recordLogoutEvent(Long userId, Map<String, Object> logoutInfo);
    
    /**
     * 获取用户登出统计
     * @param userId 用户ID
     * @param days 统计天数
     * @return 登出统计信息
     */
    Map<String, Object> getLogoutStatistics(Long userId, int days);
}
